home *** CD-ROM | disk | FTP | other *** search
- /*-----------------------------------------------------
- format.c
- to make a string to display in the clock
- KAZUBON 1997-1998
- -------------------------------------------------------*/
-
- #include "tcdll.h"
-
- char Yobi[7][11];
- char Month[12][11];
- char *YobiEng[7] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
- char *MonthEng[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
- char AM[11], PM[11], SDate[5], STime[5];
-
- extern BOOL bHour12, bHourZero;
-
- /*------------------------------------------------
- get locale info for 95/NT
- --------------------------------------------------*/
- int GetLocaleInfoWA(LCTYPE LCType, char* dst)
- {
- WCHAR s[11];
- int r;
-
- if(GetVersion() & 0x80000000) // 95
- r = GetLocaleInfoA(LOCALE_USER_DEFAULT, LCType, dst, 10);
- else // NT
- {
- r = GetLocaleInfoW(LOCALE_USER_DEFAULT,
- LCType, s, 10);
- if(r)
- WideCharToMultiByte(CP_OEMCP, 0, s, -1, dst, 10,
- NULL, NULL);
- }
- return r;
- }
-
- /*------------------------------------------------
- load strings of day, month
- --------------------------------------------------*/
- void InitFormat(void)
- {
- int i;
-
- for(i = 0; i < 6; i++)
- {
- GetLocaleInfoWA(LOCALE_SABBREVDAYNAME1 + i, Yobi[i + 1]);
- }
- GetLocaleInfoWA(LOCALE_SABBREVDAYNAME1 + 6, Yobi[0]);
- for(i = 0; i < 12; i++)
- GetLocaleInfoWA(LOCALE_SABBREVMONTHNAME1 + i, Month[i]);
- GetLocaleInfoWA(LOCALE_S1159, AM);
- GetLocaleInfoWA(LOCALE_S2359, PM);
- GetLocaleInfoWA(LOCALE_SDATE, SDate);
- GetLocaleInfoWA(LOCALE_STIME, STime);
- }
-
- /*------------------------------------------------
- make a string from date and time format
- --------------------------------------------------*/
- void MakeFormat(char* s, SYSTEMTIME* pt, char* fmt)
- {
- char *sp, *dp, *p;
-
- sp = fmt; dp = s;
- while(*sp)
- {
- if(*sp == '\"')
- {
- sp++;
- while(*sp != '\"' && *sp) *dp++ = *sp++;
- if(*sp == '\"') sp++;
- }
- else if(*sp == '/')
- {
- p = SDate; while(*p) *dp++ = *p++;
- sp++;
- }
- else if(*sp == ':')
- {
- p = STime; while(*p) *dp++ = *p++;
- sp++;
- }
- else if(*sp == 'y' && *(sp + 1) == 'y')
- {
- if(*(sp + 2) == 'y' && *(sp + 3) == 'y')
- {
- *dp++ = (char)((int)pt->wYear / 1000) + '0';
- *dp++ = (char)(((int)pt->wYear % 1000) / 100) + '0';
- sp += 2;
- }
- *dp++ = (char)(((int)pt->wYear % 100) / 10) + '0';
- *dp++ = (char)((int)pt->wYear % 10) + '0';
- sp += 2;
- }
- else if(*sp == 'm')
- {
- if(*(sp + 1) == 'm' && *(sp + 2) == 'e')
- {
- *dp++ = MonthEng[pt->wMonth-1][0];
- *dp++ = MonthEng[pt->wMonth-1][1];
- *dp++ = MonthEng[pt->wMonth-1][2];
- sp += 3;
- }
- else if(*(sp + 1) == 'm' && *(sp + 2) == 'm')
- {
- p = Month[pt->wMonth-1];
- while(*p) *dp++ = *p++;
- sp += 3;
- }
- else
- {
- if(*(sp + 1) == 'm')
- {
- *dp++ = (char)((int)pt->wMonth / 10) + '0';
- sp += 2;
- }
- else
- {
- if(pt->wMonth > 9)
- *dp++ = (char)((int)pt->wMonth / 10) + '0';
- sp++;
- }
- *dp++ = (char)((int)pt->wMonth % 10) + '0';
- }
- }
- else if(*sp == 'a' && *(sp + 1) == 'a' && *(sp + 2) == 'a')
- {
- p = Yobi[pt->wDayOfWeek];
- while(*p) *dp++ = *p++;
- sp += 3;
- }
- else if(*sp == 'd')
- {
- if(*(sp + 1) == 'd' && *(sp + 2) == 'e')
- {
- *dp++ = YobiEng[pt->wDayOfWeek][0];
- *dp++ = YobiEng[pt->wDayOfWeek][1];
- *dp++ = YobiEng[pt->wDayOfWeek][2];
- sp += 3;
- }
- else if(*(sp + 1) == 'd' && *(sp + 2) == 'd')
- {
- p = Yobi[pt->wDayOfWeek];
- while(*p) *dp++ = *p++;
- sp += 3;
- }
- else
- {
- if(*(sp + 1) == 'd')
- {
- *dp++ = (char)((int)pt->wDay / 10) + '0';
- sp += 2;
- }
- else
- {
- if(pt->wDay > 9)
- *dp++ = (char)((int)pt->wDay / 10) + '0';
- sp++;
- }
- *dp++ = (char)((int)pt->wDay % 10) + '0';
- }
- }
- else if(*sp == 'h')
- {
- int hour;
- hour = pt->wHour;
- if(bHour12)
- {
- if(hour > 12) hour -= 12;
- else if(hour == 0) hour = 12;
- if(hour == 12 && bHourZero) hour = 0;
- }
- if(*(sp + 1) == 'h')
- {
- *dp++ = (char)(hour / 10) + '0';
- sp += 2;
- }
- else
- {
- if(hour > 9)
- *dp++ = (char)(hour / 10) + '0';
- sp++;
- }
- *dp++ = (char)(hour % 10) + '0';
- }
- else if(*sp == 'n')
- {
- if(*(sp + 1) == 'n')
- {
- *dp++ = (char)((int)pt->wMinute / 10) + '0';
- sp += 2;
- }
- else
- {
- if(pt->wMinute > 9)
- *dp++ = (char)((int)pt->wMinute / 10) + '0';
- sp++;
- }
- *dp++ = (char)((int)pt->wMinute % 10) + '0';
- }
- else if(*sp == 's')
- {
- if(*(sp + 1) == 's')
- {
- *dp++ = (char)((int)pt->wSecond / 10) + '0';
- sp += 2;
- }
- else
- {
- if(pt->wSecond > 9)
- *dp++ = (char)((int)pt->wSecond / 10) + '0';
- sp++;
- }
- *dp++ = (char)((int)pt->wSecond % 10) + '0';
- }
- else if(*sp == 'A' && *(sp + 1) == 'M')
- {
- if(*(sp + 2) == '/' &&
- *(sp + 3) == 'P' && *(sp + 4) == 'M')
- {
- if(pt->wHour < 12) *dp++ = 'A';
- else *dp++ = 'P';
- *dp++ = 'M'; sp += 5;
- }
- else if(*(sp + 2) == 'P' && *(sp + 3) == 'M')
- {
- char *p;
- if(pt->wHour < 12) p = AM; else p = PM;
- while(*p) *dp++ = *p++;
- sp += 4;
- }
- }
- else if(*sp == 'a' && *(sp + 1) == 'm' && *(sp + 2) == '/' &&
- *(sp + 3) == 'p' && *(sp + 4) == 'm')
- {
- if(pt->wHour < 12) *dp++ = 'a';
- else *dp++ = 'p';
- *dp++ = 'm'; sp += 5;
- }
- else if(*sp == '\\' && *(sp + 1) == 'n')
- {
- *dp++ = 0x0d; *dp++ = 0x0a;
- sp += 2;
- }
- else *dp++ = *sp++;
- }
- *dp = 0;
- }
-
- /*------------------------------------------------
- need to display second?
- --------------------------------------------------*/
- BOOL IsDispSecond(char* fmt)
- {
- char *sp;
-
- sp = fmt;
- while(*sp)
- {
- if(*sp == '\"')
- {
- sp++;
- while(*sp != '\"' && *sp) sp++;
- if(*sp == '\"') sp++;
- }
- else if(*sp == 's')
- {
- return TRUE;
- }
- else sp++;
- }
- return FALSE;
- }
-